package com.tfjybj.itoo.exam.provider.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tfjybj.itoo.exam.entity.QuestionEntity;
import com.tfjybj.itoo.exam.model.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * QuestionDao接口
 * ${base}表
 *
 * @author 李青松
 * @version 2.0.0
 * @since 2.0.0 2018-11-01 08:55:53
 */
@Repository("questionDao")
public interface QuestionDao extends BaseMapper<QuestionEntity> {

    //region 模板生成：模糊查询

    /**
     * 根据编号模糊查询question
     *
     * @param serial 编号
     * @return 模糊查询的question集合
     * @author 李青松
     * @since 2.0.0 2018-11-01 08:55:53
     */
    List<QuestionEntity> queryLikeSerial(@Param("serial") String serial);

    List<QuestionEntity> queryQuetionsByPage();
    //endregion

    /* **********************************以下为非模板生成的内容********************************* */

    /**
     * 根据题干实体查询试题集合
     *
     * @param questionEntity 题干实体
     * @return 试题集合
     * @author 郭凯
     * @since 2.0.0 2018-11-8 15:47:09
     */
    List<QueryQuestionModel> queryByEntity(@Param("questionEntity") QuestionEntity questionEntity);

    /**
     * 试题检查--选项是否为空
     *
     * @param operator       操作人
     * @param questionTypeId 题型id
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018年11月27日08:58:37
     */
    List<QuestionModel> queryChoose(@Param("operator") String operator, @Param("questionTypeId") String questionTypeId);

    /**
     * 试题检查--选项数量
     *
     * @param operator       操作人
     * @param questionTypeId 题型id
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018年11月27日08:58:37
     */
    List<QuestionModel> queryOptionsNumber(@Param("operator") String operator, @Param("questionTypeId") String questionTypeId);

    /**
     * 试题检查--选项相同
     *
     * @param operator       操作人
     * @param questionTypeId 题型id
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018年11月27日08:58:37
     */
    List<QuestionModel> querySameOptions(@Param("operator") String operator, @Param("questionTypeId") String questionTypeId);

    /**
     * 试题检查--试题重复
     *
     * @param opeartor       操作人
     * @param questionTypeId 题型id
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018年11月27日08:58:37
     */
    List<QuestionModel> checkRepeatedQuestions(@Param("operator") String opeartor, @Param("questionTypeId") String questionTypeId);
    /**
     * 试题检查--题干重复
     *
     * @param opeartor       操作人
     * @param questionTypeId 题型id
     * @return List
     * @author 郭满亮
     * @since 2.0.0 2019年4月24日10:14:33
     */
    List<QuestionModel> checkRepeatedQuestionsContent(@Param("operator") String opeartor, @Param("questionTypeId") String questionTypeId);
    /**
     * @param opeartor       操作人
     * @param questionTypeId 题型id
     * @return List<QuestionModel>
     * @Description 查询重复的题目的题干和答案，每个只出现一次
     * @author 刁琳童
     * @since 2.0.0 2019/3/24 8:55
     */
    List<QuestionModel> checkSingleQuestionAndAnswer(@Param("operator") String opeartor, @Param("questionTypeId") String questionTypeId);

    /**
     * @param opeartor        操作人
     * @param questionTypeId  试题类型id
     * @param questionContent 试题题干
     * @param questionAnswer  试题答案
     * @return List<QuestionModel>
     * @Description 检查题目是否完全重复，通过题干和答案来判断
     * @author 刁琳童
     * @since 2.0.0 2019/3/24 8:58
     */
    List<QuestionModel> checkCompleteRepeatQuestions(@Param("operator") String opeartor, @Param("questionTypeId") String questionTypeId, @Param("questionContent") String questionContent, @Param("questionAnswer") String questionAnswer, @Param("checkResult") String checkResult);


    /**
     * 试题检查--清空字段试题的重复检查结果
     *
     * @param operator       操作人
     * @param questionTypeId 题型id
     * @return List
     * @author 刁琳童
     * @since 2.0.0 2019年3月19日 17:16:00
     */
    List<QuestionModel> updateClearCheckResult(@Param("operator") String operator, @Param("questionTypeId") String questionTypeId);


    /**
     * 试题检查--更新试题检查结果
     *
     * @param id          试题id
     * @param checkResult 检查结果
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018年11月27日08:58:37
     */
    boolean updateCheckResult(@Param("id") String id, @Param("checkResult") String checkResult);

    /**
     * @param opeartor        操作人
     * @param questionTypeId  试题类型id
     * @param questionContent 试题题干
     * @return List<QuestionModel>
     * @Description 检查题干是否重复
     * @author 郭满亮
     * @since 2.0.0 2019/3/24 8:58
     */
    List<QuestionModel> checkContentRepeatExecptRadioQuestions(@Param("operator") String opeartor, @Param("questionTypeId") String questionTypeId, @Param("questionContent") String questionContent, @Param("checkResult") String checkResult);
    /**
     * 删除单个试题
     *
     * @param id 试题id
     * @return ItooResult
     * @author 郭凯
     * @since 2.0.0 2018年11月9日16:40:36
     */
    boolean updateIsDelete(@Param("id") String id);

    /**
     * 查询试题类型名称
     *
     * @param id 试题id
     * @return String
     * @author 郭凯
     * @since 2.0.0 2018-11-8 15:48:01
     */
    String queryQuestionClassifyName(@Param("id") String id);

    /**
     * 查询试题类型名称
     *
     * @param courseId 课程id
     * @return List
     * @author 任蒙蒙
     * @since 2.0.0 2018-12-1 15:48:01
     */
    List<QuestionMainModel> selectQuestionByCourseId(@Param("courseId") String courseId, @Param("operator") String operator);

    /**
     * 查询必抽题父题对应的子题（混合题用）
     *
     * @param parentId 父题干id
     * @return List
     * @author 任蒙蒙
     * @since 2.0.0 2018-12-16 11:23:01
     */
    List<QuestionMainModel> selectSubQuestionByParentId(@Param("parentId") String parentId);

    List<QuestionMainModel> selectQuestionByParentId(@Param("courseId") String courseId, @Param("operator") String operator);

    /**
     * 查询试题类型名称
     *
     * @param questionTypeId     题型id
     * @param operator           操作人
     * @param questionClassifyId 试题分类id
     * @return List
     * @author 杨海云
     * @since 2.0.0 2018-12-1 15:48:01
     */
    List<QuestionModel> queryQuestionDegree(@Param("questionTypeId") String questionTypeId, @Param("operator") String operator, @Param("courseId") String courseId, @Param("questionClassifyId") String questionClassifyId);

    /**
     * 根据试卷id和学生id查询题干信息
     *
     * @param
     * @return boolean
     * @author 樊建华
     * @since 2018年11月23日09:02:48
     */
    List<QuestionModel> selectMainInfoByPaperRecord(@Param("paperId") String paperId, @Param("studentId") String studentId);


    /**
     * 根据试题内容模糊查询question
     *
     * @param content  试题内容
     * @param operator 操作人
     * @return 模糊查询的question
     * @author 郭凯
     * @since 2.0.0 2018-11-01 08:55:53
     */
    List<QuestionModelForHomePage> queryByLikeContent(@Param("content") String content, @Param("operator") String operator);

    /**
     * 根据操作人和课程id查询试题分类
     *
     * @param operator 操作人
     * @param courseId 课程id
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018-12-1 15:48:01
     */
    List<String> queryQuestionClassifyType(@Param("operator") String operator, @Param("courseId") String courseId);

    /**
     * 设置必抽题
     *
     * @param operator       操作人
     * @param courseId       课程id
     * @param questionTypeId 题型id
     * @return 根据id查找Question
     * @author 郭凯
     * @since 2.0.0  2018-12-8 10:27:31
     */
    List<QueryQuestionModel> queryMustSelect(@Param("operator") String operator, @Param("courseId") String courseId, @Param("questionTypeId") String questionTypeId);

    /**
     * 根据父题id查找Question
     *
     * @param id 父题id
     * @return 根据id查找Question
     * @author 郭凯
     * @since 2.0.0 2018-12-1 15:53:12
     */
    List<QuestionEntity> getByParentId(@Param("id") String id);

    /**
     * 根据id判断该题是否存在
     *
     * @param id 试题id
     * @return integer
     * @author 郭凯
     * @since 2.0.0 2018-12-1 15:53:12
     */
    Integer queryById(@Param("id") String id);

    /**
     * 根据操作人查询题型类型
     *
     * @param operator 操作者
     * @return 根据操作人查询题型类型
     * @author 贾建清
     * @since 2.0.0 2018-12-13 16:02:36
     */
    List<OperatorQuestionModel> queryQuestionType(@Param("operator") String operator);

    /**
     * 根据操作人和题型类型查询试题
     *
     * @param operator       操作员
     * @param questionTypeId 题型id
     * @return 根据操作人和题型类型查询试题
     * @author 贾建清
     * @since 2.0.0 2018-12-13 17:46:44
     */
    List<QuestionModel> queryQuestion(@Param("operator") String operator, @Param("questionTypeId") String[] questionTypeId);

    /**
     * question_Classify 模糊查询必抽题
     *
     * @param searchInput    查询内容
     * @param courseId       课程id
     * @param questionTypeId 题型id
     * @param operator       操作人
     * @author 杨海云
     * @since 2.0.0 2018-12-5 13:27:08
     */
    List<QuestionModel> indistinctQuestionClassify(@Param("searchInput") String searchInput, @Param("courseId") String courseId, @Param("questionTypeId") String questionTypeId, @Param("operator") String operator);


    /**
     * 根据课程/试题题型/分类查询试题
     *
     * @param questionEntity 试题实体
     * @return ItooResult 根据课程/试题题型/分类查询试题
     * @author 贾建清
     * @since 2.0.0 2018-12-16 14:55:14
     */
    List<QuestionModelForHomePage> queryQuestionByType(@Param("questionEntity") QuestionEntity questionEntity);

    /**
     * 根据课程id查询课程类型
     *
     * @param courseId
     * @return
     * @author 李娜
     */
    List<QuestionTypeModel> queryQuestionTypeByCourse(@Param("courseId") String courseId);

    /**
     * 根据操作人查询试题集合
     *
     * @param operator 操作人
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018-11-8 15:47:09
     */
    List<QuestionModelForHomePage> queryByOperator(@Param("operator") String operator);

    /**
     * 根据试题id 查询试题选项
     *
     * @param questionId 试题id
     * @return List
     * @author 李娜
     * @since 2.0.0 2018-11-8 15:47:09
     */
    List<String> selectOptionByQuestionId(String questionId);

    /**
     * 根据试题id 删除父试题
     */
    Integer deleteQuestionById(String questionId);

    /**
     * 根据父题id 查询子题
     *
     * @param questionId
     * @return
     * @author 李娜
     */
    List<QuestionModel> queryQuestionById(String questionId);

    /**
     * 根据父题型id删除子题
     *
     * @param questionId
     */
    void deleteQuestionByParentId(String questionId);

    /**
     * @param optionsList
     */
    void deleteOption(List<String> optionsList);

    /**
     * 根据questionId删除选项
     *
     * @param questionId
     */
    void deleteOptionByQuestionId(String questionId);

    /**
     * 检查json格式是否正确
     *
     * @param courseId       课程id
     * @param questionTypeId 题型id
     * @return ItooResult
     * @author 郭凯
     * @since 2.0.0  2019-1-16 15:14:38
     */
    List<QuestionEntity> queryByCourseId(@Param("courseId") String courseId, @Param("questionTypeId") String questionTypeId);

    /**
     * 根据旧题的Id查询旧题题干内容
     *
     * @param oldQuestionId 旧题 Id
     * @return oldQuesitonContent 旧题题干内容
     * @author 任蒙蒙
     * @since 2.0.0 2018-11-17 17:10:28
     */
    String selectOldQuestion(String oldQuestionId);

    /**
     * 根据新题的Id查询新题的model
     *
     * @param newQuestionId 新题Id
     * @return List
     * @author 任蒙蒙
     * @since 2.0.0 2018-12-29 10:10:01
     */
    QuestionMainModel selectNewQuestionModel(@Param("newQuestionId") String newQuestionId);

    /**
     * 检查json格式是否正确--更新检查结果
     *
     * @param remark     检查结果
     * @param questionId 试题id
     * @return ItooResult
     * @author 郭凯
     * @since 2.0.0  2019-1-16 15:14:38
     */
    void updateRemark(@Param("questionId") String questionId, @Param("remark") String remark);

    /**
     * 试题检查---展示最终的检查结果
     *
     * @param operator       操作人
     * @param questionTypeId 题型id
     * @return List
     * @author 郭凯
     * @since 2.0.0 2018年11月27日08:58:37
     */
    List<QuestionModelForHomePage> checkResult(@Param("operator") String operator, @Param("questionTypeId") String questionTypeId);

    /**
     * 根据旧题id查询新题id
     *
     * @param questionId 旧题id
     * @return ItooResult
     * @author 郭凯
     * @since 2.0.0  2019-1-16 15:14:38
     */
    List<QuestionEntity> selectNewQuestionById(@Param("questionId") String questionId);

    /**
     * 根据题目的历史id查询新题id
     *
     * @param historyId 题目的历史id
     * @return ItooResult
     * @author 郭凯
     * @since 2.0.0  2019-1-16 15:14:38
     */
    List<QuestionEntity> selectNewQuestionByHisId(@Param("historyId") String historyId);

    List<QuestionModelForHomePage> queryByContent(@Param("content") String content, @Param("operator") String operator,
                                                  @Param("questionClassifyId") String questionClassifyId, @Param("id") String id);

    /**
     * 根据课程id,题型id,章节id筛选题
     *
     * @param courseId           课程id
     * @param questionTypeId     试卷类型id
     * @param questionClassifyId 试卷分类
     * @param operator           登录人
     * @return 符合筛选条件的集合
     * @author 马莹
     * @since 2019-1-31 10:09:00
     */
    List<QuestionMainModel> selectQuestion(@Param("courseId") String courseId, @Param("questionTypeId") String questionTypeId, @Param("questionClassifyId") String questionClassifyId, @Param("operator") String operator);

    List<QuestionEntity> selectHtml();

    void updateText(@Param("id") String id, @Param("c") String c);

    void updateTextB(@Param("id") String id, @Param("b") String b);

    /**
     * 检查试题编号重复
     * @param serial
     * @return List
     * @author duyu
     * @since 2019年5月26日11:32:17
     */
    List<QuestionEntity> checkSerial(@Param("serial") String serial, @Param("operator") String operator);

   List<QuestionAndOptionModel> checkCompleteQuestions(QuestionAndOptionModel questionAndOption);

    List<QuestionEntity>  selectQuestionByCourse(@Param("courseId") String courseId);

}
